package com.funong.matrix.biz.user.domain;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.funong.matrix.biz.base.dao.SysDeptDao;
import com.funong.matrix.biz.user.pojo.dto.SysDeptDTO;
import com.funong.matrix.biz.base.entity.SysCompanyEntity;
import com.funong.matrix.biz.base.entity.SysDeptEntity;
import com.funong.matrix.core.dto.QueryDTO;
import com.funong.matrix.core.dto.Result;
import com.funong.matrix.core.enums.IsDeletedEnum;
import com.funong.matrix.core.enums.ResultCodeEnum;
import com.funong.matrix.core.enums.StatusEnum;
import com.funong.matrix.core.utils.BusinessException;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author wanjialin
 * @version 1.0
 * @date 2023/5/18
 */

@Service
public class SysDeptDomainDao {

    @Resource
    private SysDeptDao sysDeptDao;
    @Resource
    private SysCompanyDomainDao sysCompanyDomainDao;


    public Result queryDept(QueryDTO<SysDeptEntity> queryDTO) {
        IPage<SysDeptEntity> sysDeptEntityIPage = sysDeptDao.queryDept(queryDTO);

        List<SysDeptDTO> sysDeptDTOS = sysDeptEntityIPage.getRecords().stream().map(sysDeptEntity -> {
                    SysDeptDTO sysDeptDTO = new SysDeptDTO();
                    BeanUtils.copyProperties(sysDeptEntity, sysDeptDTO);
                    SysCompanyEntity sysCompanyEntity = sysCompanyDomainDao.queryCompanyByCode(sysDeptDTO.getCompanyCode());
                    if (null != sysCompanyEntity) {
                        sysDeptDTO.setCompanyName(sysCompanyEntity.getName());
                    }

                    return sysDeptDTO;
                }
        ).collect(Collectors.toList());

        return Result.page(sysDeptEntityIPage, sysDeptDTOS);
    }

    public SysDeptEntity queryDeptById(Integer Id) {
        return sysDeptDao.getById(Id);
    }

    public SysDeptEntity queryDeptByCode(String deptCode) {
        return sysDeptDao.queryDeptByCode(deptCode);
    }

    public SysDeptEntity queryDeptAllByCode(String deptCode) {
        return sysDeptDao.queryDeptAllByCode(deptCode);
    }


    public Boolean saveDept(SysDeptEntity sysDeptEntity) {

        SysCompanyEntity sysCompanyEntity = sysCompanyDomainDao.queryCompanyByCode(sysDeptEntity.getCompanyCode());
        if (null == sysCompanyEntity) {
            throw new BusinessException(ResultCodeEnum.COMP_NOT_FIND);
        }
        if (sysCompanyEntity.getParentId() == 0) {
            throw new BusinessException(ResultCodeEnum.DEPT_SAVE_PARENT_COMP);
        }

        SysDeptEntity deptEntity = sysDeptDao.queryDeptDesc();

        String code = generateDeptCode(null == deptEntity ? null : deptEntity.getCode());
        sysDeptEntity.setCode(code);

        return sysDeptDao.save(sysDeptEntity);
    }


    public Boolean updateDept(SysDeptEntity sysDeptEntity) {
        return sysDeptDao.updateById(sysDeptEntity);
    }


    public Boolean deleteDept(Integer id) {

        SysDeptEntity sysDeptEntity = sysDeptDao.getById(id);

        if (null == sysDeptEntity) {
            throw new RuntimeException("用户不存在");
        }

        sysDeptEntity.setIsDeleted(IsDeletedEnum.DELETED.getValue());

        return sysDeptDao.updateById(sysDeptEntity);
    }


    public List<SysDeptEntity> queryDeptByCompanyCode(String companyCode) {
        return sysDeptDao.queryDeptByCompanyCode(companyCode);
    }

    public Boolean updateDeptStatus(Integer id) {

        SysDeptEntity sysDeptEntity = sysDeptDao.getById(id);

        if (StatusEnum.ENABLE.getValue().equals(sysDeptEntity.getStatus())) {

            sysDeptEntity.setStatus(StatusEnum.DISABLE.getValue());
        } else {
            sysDeptEntity.setStatus(StatusEnum.ENABLE.getValue());

        }

        return sysDeptDao.updateById(sysDeptEntity);
    }

    public String generateDeptCode(String companyCode) {

        String code;

        if (StringUtils.isNotEmpty(companyCode)) {
            String no = companyCode.substring(1);

            Integer newCode = 1 + Integer.parseInt(no);

            code = String.format("D" + "%07d", newCode);
        } else {
            code = "D0000001";
        }

        return code;
    }
}
